package com.bitoon.basketdudes.web.xhr;

import com.bitoon.basketdudes.web.BaseAction;
import com.bitoon.basketdudes.web.datos.*;
import java.io.File;
import java.io.FileOutputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;
import org.apache.struts2.ServletActionContext;
import org.jdom.*;
import org.jdom.input.SAXBuilder;
import org.apache.log4j.Logger;
import org.jdom.output.XMLOutputter;

public class Noticias extends BaseAction {

    private List<Noticia> datos;
    private InfoCabeceraXHR cabecera;
    private int pagina = 1;
    private Integer cuantos;                             //cuantos registros mostrar
    private static String pathNoticias = "/bd/xml";      //ruta base de los ficheros xml
    
    private String[] noticia; // Para recibir los ids del borrado de noticias
    private String urlNoticia;

    private Logger log = Logger.getLogger(Noticias.class);

    @Override
    public String execute() {
        try {
            setDatos(leerNoticiasXML());

            ServletActionContext.getRequest().setAttribute("noticias", datos);
            ServletActionContext.getRequest().setAttribute("cabecera", cabecera);

        } catch (Exception e) {
            log.error("Error", e);
        }

        return SUCCESS;
    }

    private List<Noticia> leerNoticiasXML() {
        int NOTICIAS_PAGINA_HOME = 4;
        
        return leerNoticiasXML(NOTICIAS_PAGINA_HOME, getPagina());
    }

    private List<Noticia> leerNoticiasXML(int cuantas, int nPagina) {

        List<Noticia> retorno = null;
        log.debug("Entro a leer noticias");

        try {
            Document doc = obtenerXMLNoticias();

            if (doc != null){
                Element root = doc.getRootElement();
                int x = 0;

                String lidioma = "zh";

                Iterator iterator = root.getChildren().iterator();
                cuantos = root.getChildren().size() / cuantas + 1;

                int totalRegistros = root.getChildren().size();
                int totalPaginas = (totalRegistros-1)/cuantas + 1;
                
                // Pasar las páginas hasta "pagina"
                int saltarHasta = (pagina-1)*cuantas;
                while (iterator.hasNext() && (x++ < saltarHasta)) {
                    Element child = (Element) iterator.next();
                }

                x = 0;
                //creamos la lista de noticias
                retorno = new ArrayList<Noticia>();
                while (iterator.hasNext() && (x++ < cuantas) ) {

                    Element el = (Element) iterator.next();
                    Noticia laNoticia = new Noticia();

                    String sFecha = el.getChild("fecha").getText();
                    String prefijoUrl = "/noticias/";
                    if (!lidioma.equals("es")) {
                        prefijoUrl="/news/";
                    }

                    laNoticia.setId(Integer.parseInt(el.getChild("id").getValue()));
                    laNoticia.setTitulo(el.getChild("titular").getValue());
                    laNoticia.setEntradilla(el.getChild("entradilla").getValue());
                    laNoticia.setCuerpo(el.getChild("cuerpo").getValue());
                    laNoticia.setUrl(prefijoUrl +el.getChild("url").getValue());

                    DateFormat df = new SimpleDateFormat("yyyyMMdd");                
                    Date fecha = df.parse(sFecha);
                    GregorianCalendar gc = new GregorianCalendar();
                    gc.setTime(fecha);
                    laNoticia.setDia(gc.get(gc.DATE));
                    laNoticia.setMes(Integer.toString(gc.get(gc.MONTH)+1));
                    laNoticia.setAnyo(gc.get(gc.YEAR));

                    retorno.add(laNoticia);
                }
                
                cabecera = new InfoCabeceraXHR();
                cabecera.setCorrecto(1);
                cabecera.setActual(pagina);
                cabecera.setTotal(totalPaginas);
                setCabecera(cabecera);
                log.debug("Total pagina: " + totalPaginas);
                log.debug("Total registros: " + totalRegistros);
            }
        } catch (Exception e) {
            log.error("[ERROR][leerNoticiasXML]: " + e);
        }

        return retorno;
    }

    protected Document obtenerXMLNoticias() {

        Document retorno = null;
        try {
            SAXBuilder parser = new SAXBuilder();
            File f = new File(ServletActionContext.getServletContext().getRealPath(getPathNoticias()));
            if (f.exists()) {
                if (f.length() > 0) {
                    retorno = parser.build(f);
                }
            }
        } catch (JDOMException  jde) {
        } catch (Exception e) {
            log.error("Error", e);
        }

        return retorno;

    }



    public void borrarNoticiasPorId(int idNoticia) {

        try {
            //formato de noticia
            Element root = new Element("noticias");
            Document nuevoDoc = new Document(root); //nuevo documento

            log.debug("id noticia: " + idNoticia);

            //lista actual de mensajes
            Document doc = obtenerXMLNoticias();
            if (doc != null) {
                //cogemos el children
                List children = doc.getRootElement().getChildren();
                log.debug("chidren: " + children +" nºelementos: "+children.size());
                Iterator iter = children.iterator();
                while (iter.hasNext()) {
                    Element child = (Element)iter.next();
                    log.debug("Element Child: "+child.getChild("id"));
                    if (child.getChild("id").getValue().equals(Integer.toString(idNoticia))) {
                        //no insertamos el mensaje en el nuevo doc
                        log.debug("id: " + idNoticia);
                    } else {
                        //borramos del iterator y añadimos el mensaje que no coincide
                        log.debug("Añadiendo " + child);
                        log.debug("nuevoDoc: " + nuevoDoc);
                        log.debug("name: " + child.getName());
                        iter.remove();
                        nuevoDoc.getRootElement().addContent(child);
                    }
                }

                // Grabar el nuevo doc con el elemento borrado
                volcarDocAFichero(nuevoDoc);
            }
        } catch (Exception e) {
            log.error("[borrarNoticiasPorId] ",e);
        }
    }

    protected void volcarDocAFichero(Document doc) {
        try {
            File f = null;
            f = new File(ServletActionContext.getServletContext().getRealPath(getPathNoticias()));
            FileOutputStream fout = new FileOutputStream(f);

            XMLOutputter out = new XMLOutputter();
            out.output(doc, fout);
        } catch (Exception e) {
            log.error("[volcarFichero Noticia]", e);
        }
    }

    public String homeNoticias() {
        setDatos(leerNoticiasXML(3, 1));
        return SUCCESS;
    }

    public List<Noticia> getDatos() {
        return datos;
    }

    public void setDatos(List<Noticia> datos) {
        this.datos = datos;
    }

    public void setPagina(int pagina) {
        this.pagina = pagina;
    }

    public InfoCabeceraXHR getCabecera() {
        return cabecera;
    }

    public void setCabecera(InfoCabeceraXHR cabecera) {
        this.cabecera = cabecera;
    }

    public String getPathNoticias() {
        //idoma es heredado desde BaseAction
        return pathNoticias+"/noticias_" + idioma + ".xml";
    }

    public void setPathNoticias(String aPathNoticias) {
        pathNoticias = aPathNoticias;
    }

    public Integer getCuantos() {
        return cuantos;
    }

    public void setCuantos(Integer cuantos) {
        this.cuantos = cuantos;
    }

    public int getPagina() {
        return pagina;
    }

    public String[] getNoticia() {
        return noticia;
    }

    public void setNoticia(String[] noticia) {
        this.noticia = noticia;
    }

    public String getUrlNoticia() {
        return urlNoticia;
    }

    public void setUrlNoticia(String urlNoticia) {
        this.urlNoticia = urlNoticia;
    }

}
